package org.jsola.hr.service;

import org.jsola.admin.query.HeaderFieldsQuery;
import org.jsola.admin.vo.HeaderFieldsVO;
import org.jsola.core.Page;
import org.jsola.core.service.IService;
import org.jsola.hr.dao.ITreatmentDisposeEventDAO;
import org.jsola.hr.dto.TreatmentDisposeEventAddDTO;
import org.jsola.hr.dto.TreatmentDisposeEventUpdateDTO;
import org.jsola.hr.entity.FormGroupFieldDO;
import org.jsola.hr.entity.TreatmentDisposeEventDO;
import org.jsola.hr.query.TreatmentDisposeEventExportQuery;
import org.jsola.hr.query.TreatmentDisposeEventQuery;
import org.jsola.hr.vo.FormGroupFieldVO;
import org.jsola.hr.vo.ImportExcelResultListVO;
import org.jsola.hr.vo.TreatmentDisposeEventListVO;
import org.jsola.hr.vo.TreatmentDisposeEventVO;
import org.jsola.user.core.TokenUser;

import java.io.File;
import java.util.List;
import java.util.Map;


/**
 * 待遇处理事件
 *
 * @author zhr
 */
public interface ITreatmentDisposeEventService extends IService<ITreatmentDisposeEventDAO, TreatmentDisposeEventDO> {

    /**
     * 新增待遇处理事件
     *
     * @param treatmentDisposeEventAddDTO 新增待遇处理事件DTO
     * @param tokenUser                   当前用户
     * @return 待遇处理事件详情信息
     */
    TreatmentDisposeEventVO save(TreatmentDisposeEventAddDTO treatmentDisposeEventAddDTO, TokenUser tokenUser);

    /**
     * 修改待遇处理事件
     *
     * @param treatmentDisposeEventUpdateDTO 修改待遇处理事件DTO
     * @param tokenUser                      当前用户
     * @return 更新数量
     */
    int update(TreatmentDisposeEventUpdateDTO treatmentDisposeEventUpdateDTO, TokenUser tokenUser);


    /**
     * 批量删除待遇处理事件，物理删除，更新is_valid字段，从回收站删除
     *
     * @param tokenUser                当前用户
     * @param treatmentDisposeEventIds 待遇处理事件id
     * @return 删除数量
     */
    int deleteByIds(TokenUser tokenUser, String... treatmentDisposeEventIds);

    /**
     * 根据待遇处理事件id查找
     *
     * @param treatmentDisposeEventId 待遇处理事件id
     * @param siteId                  所属站点id
     * @return 待遇处理事件详情信息
     */
    TreatmentDisposeEventVO selectById(String treatmentDisposeEventId, String siteId);

    /**
     * 查询待遇处理事件
     *
     * @param treatmentDisposeEventQuery 查询条件
     * @param siteId                     所属站点id
     * @return 待遇处理事件列表信息
     */
    List<TreatmentDisposeEventListVO> select(TreatmentDisposeEventQuery treatmentDisposeEventQuery, String siteId);

    /**
     * 查询待遇处理事件记录数
     *
     * @param treatmentDisposeEventQuery 查询条件
     * @param siteId                     所属站点id
     * @return 待遇处理事件记录数
     */
    int selectCount(TreatmentDisposeEventQuery treatmentDisposeEventQuery, String siteId);

    /**
     * 分页查询待遇处理事件
     *
     * @param treatmentDisposeEventQuery 查询条件
     * @param siteId                     所属站点id
     * @return 待遇处理事件列表信息
     */
    Page<TreatmentDisposeEventListVO> selectPage(TreatmentDisposeEventQuery treatmentDisposeEventQuery, String siteId);


    /**
     * 根据待遇处理事件id查找
     *
     * @param treatmentDisposeEventId 待遇处理事件id
     * @param siteId                  所属站点id
     * @return 待遇处理事件
     */
    TreatmentDisposeEventDO selectDOById(String treatmentDisposeEventId, String siteId);

    /**
     * 查询待遇处理事件
     *
     * @param treatmentDisposeEventQuery 查询条件
     * @param siteId                     所属站点id
     * @return 待遇处理事件列表
     */
    List<TreatmentDisposeEventDO> selectDO(TreatmentDisposeEventQuery treatmentDisposeEventQuery, String siteId);

    /**
     * 完结事件或恢复未完结
     *
     * @param eventId   事件Id
     * @param status    完结状态
     * @param tokenUser 当前用户
     */
    void finishOrUnfinishedEvent(String eventId, Boolean status, TokenUser tokenUser);

    /**
     * 查询事件详情
     *
     * @param eventId   事件Id
     * @param tokenUser 当前用户
     * @return 事件详情
     */
    TreatmentDisposeEventVO selectEventInfoById(String eventId, TokenUser tokenUser);

    /**
     * 查询对应模板下是否存在未完结的事件
     *
     * @param templateId 模板Id
     * @param tokenUser  当前用户
     * @return 未完结事件列表
     */
    List<TreatmentDisposeEventDO> selectNotFinishEventByTemplateId(String templateId, TokenUser tokenUser);

    /**
     * 批量更新事件为已完成
     *
     * @param eventIdList 事件Id
     */
    void bachUpdateFinish(List<String> eventIdList);

    /**
     * 导入事件
     *
     * @param file       文件
     * @param templateId 模板Id
     * @param tokenUser  当前用户
     * @return 导入结果
     */
    ImportExcelResultListVO<Map<String, String>> importEvent(File file, String templateId, TokenUser tokenUser);

    /**
     * 导入事件,错误数据导出
     *
     * @param errorInfo 导出参数
     * @return 路径
     */
    String errorListExport(ImportExcelResultListVO<Map<String, String>> errorInfo);

    /**
     * Excel数据入库
     *
     * @param templateFieldMap 模板字段
     * @param saveList         入库数据
     * @param templateId       模板Id
     * @param tokenUser        当前用户
     */
    void saveImport(List<Map<String, String>> saveList, Map<String, FormGroupFieldDO> templateFieldMap,
                    String templateId, TokenUser tokenUser);

    /**
     * 导出事件
     *
     * @param query     导出参数
     * @param tokenUser 当前用户
     * @return Excel路径
     */
    String export(TreatmentDisposeEventExportQuery query, TokenUser tokenUser);

    /**
     * 查询相关员工的待遇处理事件
     *
     * @param empId     员工Id
     * @param tokenUser 当前用户
     * @return 相关员工的待遇处理事件
     */
    List<TreatmentDisposeEventVO> selectEventByEmpId(String empId, TokenUser tokenUser);

    /**
     * 根据员工Id列表查询未完结事件
     *
     * @param empIdList 员工Id列表
     * @param tokenUser 当前用户
     * @return 未完结事件
     */
    List<TreatmentDisposeEventDO> findNotFinishedEventByEmpIdList(List<String> empIdList, TokenUser tokenUser);

    /**
     * 批量保存
     *
     * @param eventList 保存列表
     */
    void bachSave(List<TreatmentDisposeEventDO> eventList);

    /**
     * 获取待遇处理导出表头
     *
     * @param headerQuery 导出参数
     * @param tokenUser   当前用户
     * @return 表头
     */
    HeaderFieldsVO getEventExportHead(HeaderFieldsQuery headerQuery, TokenUser tokenUser);

    /**
     * 根据事件Id列表查询事件
     *
     * @param eventIdList 事件id列表
     * @param tokenUser   当前用户
     * @return 事件列表
     */
    List<TreatmentDisposeEventDO> selectByIdList(List<String> eventIdList, TokenUser tokenUser);

    /**
     * 根据模板Id查询事件
     *
     * @param templateId 模板Id
     * @param tokenUser  当前用户
     * @return 事件列表
     */
    List<TreatmentDisposeEventDO> selectEventByTemplateId(String templateId, TokenUser tokenUser);

    /**
     * 更新模板时会在模板中新增字段,此方法同步把这些字段更新到用这个模板的事件中
     *
     * @param templateId 模板Id
     * @param fieldList  新增的字段列表
     * @param tokenUser  当前用户
     */
    void addFieldAsyncUpdateEvent(String templateId, List<FormGroupFieldVO> fieldList, TokenUser tokenUser);

}


